package shujia.day06;

/*
    多态的好处
        提高了程序的维护性(由继承保证)
        提高了程序的扩展性(由多态保证)
 */


class Animal2 {
    public void eat() {
        System.out.println("吃饭");
    }

    public void sleep() {
        System.out.println("睡觉");
    }
}

class Dog2 extends Animal2 {
    @Override
    public void eat() {
        System.out.println("🐕吃🥩");
    }

    @Override
    public void sleep() {
        System.out.println("🐕侧着睡");
    }
}

class Cat2 extends Animal2 {
    @Override
    public void eat() {
        System.out.println("🐱吃🐟");
    }

    @Override
    public void sleep() {
        System.out.println("🐱蜷着睡");
    }
}

class Pig extends Animal2 {
    @Override
    public void eat() {
        System.out.println("🐖吃米");
    }

    @Override
    public void sleep() {
        System.out.println("🐖趴着睡");
    }
}

class Tiger extends Animal2{
    @Override
    public void eat() {
        System.out.println("🐅吃🐏");
    }

    @Override
    public void sleep() {
        System.out.println("🐅趴着睡");
    }
}

class AnimalTool {

    private AnimalTool() {

    }

    // 将来当你看到一个类作为方法的参数类型的时候，也可以传入该类的子类对象形成多态
    public static void useAnimal(Animal2 animal2) { //Animal2 animal2 = new Tiger()
        animal2.eat();
        animal2.sleep();
    }

//    public static void useCat(Cat2 c){
//        c.eat();
//        c.sleep();
//    }
//
//    public static void useDog(Dog2 d){
//        d.eat();
//        d.sleep();
//    }
//
//    public static void usePig(Pig p){ //Pig p = new Pig()
//        p.eat();
//        p.sleep();
//    }
}

public class DuoTaiDemo3 {
    public static void main(String[] args) {
        //我想养一只🐕
        Dog2 d1 = new Dog2();
//        d1.eat();
//        d1.sleep();
//        useDog(d1);
        AnimalTool.useAnimal(d1); // new Dog2()
        Dog2 d2 = new Dog2();
//        d2.eat();
//        d2.sleep();
//        useDog(d2);
        AnimalTool.useAnimal(d2);
        //养🐱
        Cat2 c1 = new Cat2();
//        c1.eat();
//        c1.sleep();
//        useCat(c1);
        AnimalTool.useAnimal(c1);
        Cat2 c2 = new Cat2();
//        c2.eat();
//        c2.sleep();
//        useCat(c2);
        AnimalTool.useAnimal(c2);

        //随着我养动物的种类越来越多，首先
        //具体动物类必须定义，其次按照之前的写法，也会在当前类中写一个有关动物的使用方法
        //我们可以单独使用一个类，将有关动物使用的功能方法放到一个类中，定义成工具类
        Pig p1 = new Pig();
        AnimalTool.useAnimal(p1); // new Pig()

        //我们虽然可以实现新的动物，并且测试类中不会有新的方法添加
        //但是工具类一般来说不会频繁的进行修改
        //可以使用多态改进传参特点
        Tiger tiger = new Tiger();
        AnimalTool.useAnimal(tiger); // new Tiger()


    }


}
